/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo4;

import Acceso.Security;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.util.regex.*;
import javax.mail.Message;

/**
 *
 * @author dayana
 */
public class consultarObjPerdidoaDSIAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";
    private static final Pattern rfc2822 = Pattern.compile(
            "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");

    boolean validarCaracteres(ActionErrors errors, String cadena, String err, HttpServletRequest request, Pattern p) {

        Matcher m;
        m = p.matcher(cadena);

        if (m.find()) {
            errors.add(err, new ActionMessage("errors." + err));
            saveErrors(request, errors);
            return true;
        }
        return false;
    }

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        consultarObjPerdidoaDSIForm formulario = (consultarObjPerdidoaDSIForm) form;

        String nomb = request.getParameter("nombre");
        String apellido = request.getParameter("apellido");
        String correo = request.getParameter("correo");
        String tipo = request.getParameter("tipoObj");
        String otro = request.getParameter("otro");
        String descripcion = request.getParameter("descripcion");
        String fecha = request.getParameter("fecha");
        String lugar = request.getParameter("lugar");
        boolean hayError = false;
        boolean momento;
        Pattern p;
        boolean aux = false;

        ActionErrors errors = new ActionErrors();

        if (nomb == null || nomb.length() < 1 || nomb.equals(" ")) {
            errors.add("campo_nombre_requerido", new ActionMessage("errors.campo_nombre_requerido"));
            saveErrors(request, errors);
            hayError = true;
        } else {
            // comprueba que el campo solo tenga caracteres a-z y espacios " "
            p = Pattern.compile("[^a-zA-Záéíóú ]+");
            momento = validarCaracteres(errors, nomb, "invalid_caracter_N", request, p);
            hayError = (momento || hayError);
        }

        if (apellido == null || apellido.length() < 1 || apellido.equals(" ")) {
            errors.add("campo_apellido_requerido", new ActionMessage("errors.campo_apellido_requerido"));
            saveErrors(request, errors);
            hayError = true;
        } else {
            // comprueba que el campo solo tenga caracteres a-z y espacios " "
            p = Pattern.compile("[^a-zA-Záéíóú ]+");
            momento = validarCaracteres(errors, apellido, "invalid_caracter_A", request, p);
            hayError = (momento || hayError);
        }

        if (correo == null || correo.length() < 1 || correo.equals(" ")) {
            errors.add("campo_correo_requerido", new ActionMessage("errors.campo_correo_requerido"));
            saveErrors(request, errors);
            aux = true;
            hayError = true;
        }

        if (lugar == null || lugar.length() < 1 || lugar.equals(" ")) {
            errors.add("campo_lugar_requerido", new ActionMessage("errors.campo_lugar_requerido"));
            saveErrors(request, errors);
            hayError = true;
        } else {
            // comprueba que el campo solo tenga caracteres a-z y espacios " "
            p = Pattern.compile("[^a-zA-Záéíóú ]+");
            momento = validarCaracteres(errors, lugar, "invalid_caracter_L", request, p);
            hayError = (momento || hayError);
        }

        if (fecha.equals("dd/mm/aaaa")) {
            errors.add("format_Fecha", new ActionMessage("errors.format_Fecha"));
            saveErrors(request, errors);
            hayError = true;
        } 

        if (tipo.equals("seleccionar")) {
            errors.add("campo_tipo_requerido", new ActionMessage("errors.campo_tipo_requerido"));
            saveErrors(request, errors);
            hayError = true;
        }


        if (tipo.equals("Otro")) {
            tipo = request.getParameter("otro");

            // comprueba que el campo solo tenga caracteres a-z y espacios " "
            p = Pattern.compile("[^a-zA-Záéíóú ]+");
            momento = validarCaracteres(errors, tipo, "invalid_caracter_otro", request, p);
            hayError = (momento || hayError);

            if (!hayError) {
                formulario.setOtro(tipo);
            }
        }


        if (descripcion == null || descripcion.length() < 1 || descripcion.equals(" ")) {
            errors.add("campo_descripcion_requerido", new ActionMessage("errors.campo_descripcion_requerido"));
            saveErrors(request, errors);
            hayError = true;
        }


        //Chequeamos que tenga una arroba
        if (correo.indexOf("@") == -1 || !rfc2822.matcher(correo).matches()) {
            if (!aux) {
                errors.add("invalid_Email", new ActionMessage("errors.invalid_Email"));
                saveErrors(request, errors);
                hayError = true;
            }

        }

        if (hayError) {
            return mapping.findForward(FAILURE);
        }

        //ENVIO DE CORREO
        try {
            // Propiedades de la conexión
            Properties props = new Properties();
            props.setProperty("mail.smtp.host", "smtp.gmail.com");
            props.setProperty("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.port", "587");
            props.setProperty("mail.smtp.user", "dsi.objperdidos@gmail.com");
            props.setProperty("mail.smtp.auth", "true");

//             Preparamos la sesion
            Session session = Session.getDefaultInstance(props);

            // Construimos el mensaje
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(correo));
            message.addRecipient(
                    Message.RecipientType.TO,
                    new InternetAddress("dsi.objperdidos@gmail.com"));
            message.setSubject("Consulta Objeto Perdido");

            message.setText(
                    "Nombre: " + nomb
                    + "\nApellido: " + apellido
                    + "\nCorreo Electronico: " + correo
                    + "\nTipo de Objeto solicitado: " + tipo
                    + "\nFecha de perdida de Objeto solicitado: " + fecha
                    + "\nLugar donde se perdió el Objeto solicitado: " + lugar
                    + "\nDescripcion del objeto: " + descripcion);

            // Lo enviamos.
            Transport t = session.getTransport("smtp");
            t.connect("dsi.objperdidos@gmail.com", "dsiusb123");
            t.sendMessage(message, message.getAllRecipients());

            // Cierre.
            t.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //Limpiamos el formulario
        formulario.setNombre(" ");
        formulario.setApellido(" ");
        formulario.setCorreo(" ");
        formulario.setTipoObj(" ");
        formulario.setOtro(" ");
        formulario.setFecha(" ");
        formulario.setLugar(" ");
        formulario.setDescripcion(" ");


        errors.add("formulario_enviado", new ActionMessage("errors.formulario_enviado"));
        saveErrors(request, errors);

        return mapping.findForward(SUCCESS);
    }
}
